[羊城杯 2020]easyre

这题中为了方便,

第一次加密的密文叫enc1,

第二次加密后叫enc2,

第三次加密后叫enc3

exe差壳无壳ida发现有一串疑似base64的密文和3个加密函数

main

三个,足足三个,刚看还是觉得有点吓人,冷静下来分析

是明文经过3轮加密变成密文,然后密文和给出的疑似base64的字符进行比对

所以疑似base64的字符串就是enc3

先从第三加密个开始分析

跟进encode_three

en3

这是个凯撒加密,大写字母,小写字母,数字分别在自己的范围中替换成enc2字母后数第3个字母(这里的明文是经过前两轮加密后的密文)

写个脚本给换回来:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
def caesar_cipher(text, shift):
result = []

for char in text:
# 如果是大写字母
if 'A' <= char <= 'Z':
new_char = chr((ord(char) - ord('A') - shift) % 26 + ord('A'))
result.append(new_char)
# 如果是小写字母
elif 'a' <= char <= 'z':
new_char = chr((ord(char) - ord('a') - shift) % 26 + ord('a'))
result.append(new_char)
# 如果是数字
elif '0' <= char <= '9':
new_char = chr((ord(char) - ord('0') - shift) % 10 + ord('0'))
result.append(new_char)
# 其他字符不变
else:
result.append(char)

return ''.join(result)

# 测试凯撒密码
text = "EmBmP5Pmn7QcPU4gLYKv5QcMmB3PWHcP5YkPq3=cT6QckkPckoRG"
shift = 3
encrypted_text = caesar_cipher(text, shift)
print("Encrypted Text:", encrypted_text)

换过来后跟进第二个加密

enc2

这是把en2分成4个部分,而en2长度刚好是52,恰好符合每段13个字符

这段加密是吧明文的4个部分进行了位置交换,

明文第三段 → 密文第一段

明文第一段 → 密文第二段

明文第四段 → 密文第三段

明文第二段 → 密文第四段

所以只需要把每段密文换回去就能等出enc1


最后看第一个加密

enc1

其中alphabet是标准base64表

跟进cmove_bits后就是我写的注释内容

综合来看就是一个标准的base64,

所以把enc1交给解密网站就好了

decory